/**
 * 公共配置服务
 * 提供获取和管理公共配置数据的功能
 */

import { PUBLIC_API } from '../config/api.js'

// 存储键名常量
const STORAGE_KEYS = {
  PUBLIC_CONFIG: 'publicConfig',
  CONFIG_TIMESTAMP: 'configTimestamp'
}

// 缓存时间（毫秒）- 30分钟
const CACHE_DURATION = 30 * 60 * 1000

/**
 * 获取公共配置数据
 * @param {boolean} forceRefresh 是否强制刷新，默认false
 * @returns {Promise<object>} 公共配置数据
 */
export async function getPublicConfig(forceRefresh = false) {
  try {
    // 检查是否需要从缓存获取
    if (!forceRefresh) {
      const cachedConfig = getCachedConfig()
      if (cachedConfig) {
        console.log('使用缓存的公共配置数据')
        return cachedConfig
      }
    }

    console.log('请求公共配置接口...')
    
    // 请求公共配置接口
    const response = await uni.request({
      url: PUBLIC_API.CONFIG,
      method: 'GET',
      header: {
        'Content-Type': 'application/json'
      }
    })

    console.log('公共配置接口响应:', response)

    if (response.statusCode === 200 && response.data.code === 200) {
      const configData = response.data.data
      
      // 缓存配置数据
      cacheConfig(configData)
      
      console.log('公共配置获取成功:', configData)
      return configData
    } else {
      throw new Error(response.data?.data?.error_message || response.data?.error_message || response.data?.message || '获取公共配置失败')
    }
  } catch (error) {
    console.error('获取公共配置失败:', error)
    
    // 如果请求失败，尝试使用缓存数据
    const cachedConfig = getCachedConfig(true) // 忽略过期时间
    if (cachedConfig) {
      console.log('使用过期的缓存配置数据')
      return cachedConfig
    }
    
    throw error
  }
}

/**
 * 获取缓存的配置数据
 * @param {boolean} ignoreExpiry 是否忽略过期时间
 * @returns {object|null} 缓存的配置数据或null
 */
function getCachedConfig(ignoreExpiry = false) {
  try {
    const cachedData = uni.getStorageSync(STORAGE_KEYS.PUBLIC_CONFIG)
    const timestamp = uni.getStorageSync(STORAGE_KEYS.CONFIG_TIMESTAMP)
    
    if (!cachedData || !timestamp) {
      return null
    }
    
    // 检查是否过期
    if (!ignoreExpiry) {
      const now = Date.now()
      if (now - timestamp > CACHE_DURATION) {
        console.log('缓存的公共配置已过期')
        return null
      }
    }
    
    return JSON.parse(cachedData)
  } catch (error) {
    console.error('获取缓存配置失败:', error)
    return null
  }
}

/**
 * 缓存配置数据
 * @param {object} configData 配置数据
 */
function cacheConfig(configData) {
  try {
    uni.setStorageSync(STORAGE_KEYS.PUBLIC_CONFIG, JSON.stringify(configData))
    uni.setStorageSync(STORAGE_KEYS.CONFIG_TIMESTAMP, Date.now())
    console.log('公共配置已缓存')
  } catch (error) {
    console.error('缓存配置失败:', error)
  }
}

/**
 * 清除缓存的配置数据
 */
export function clearConfigCache() {
  try {
    uni.removeStorageSync(STORAGE_KEYS.PUBLIC_CONFIG)
    uni.removeStorageSync(STORAGE_KEYS.CONFIG_TIMESTAMP)
    console.log('公共配置缓存已清除')
  } catch (error) {
    console.error('清除配置缓存失败:', error)
  }
}

/**
 * 获取应用配置
 * @param {boolean} forceRefresh 是否强制刷新
 * @returns {Promise<object>} 应用配置数据
 */
export async function getAppConfig(forceRefresh = false) {
  const config = await getPublicConfig(forceRefresh)
  return config?.app_config || {}
}

/**
 * 获取海报配置
 * @param {boolean} forceRefresh 是否强制刷新
 * @returns {Promise<object>} 海报配置数据
 */
export async function getPosterConfig(forceRefresh = false) {
  const config = await getPublicConfig(forceRefresh)
  return config?.poster_config || {}
}

/**
 * 获取系统公告
 * @param {boolean} forceRefresh 是否强制刷新
 * @returns {Promise<string>} 系统公告内容
 */
export async function getSystemNotice(forceRefresh = false) {
  const appConfig = await getAppConfig(forceRefresh)
  return appConfig?.system_notice || '本软件仅用于学习使用,不可用于正式考试。'
}

/**
 * 获取应用名称
 * @param {boolean} forceRefresh 是否强制刷新
 * @returns {Promise<string>} 应用名称
 */
export async function getAppName(forceRefresh = false) {
  const appConfig = await getAppConfig(forceRefresh)
  return appConfig?.app_name || 'solve拍照搜题'
}

/**
 * 获取SVIP价格
 * @param {boolean} forceRefresh 是否强制刷新
 * @returns {Promise<number>} SVIP价格（分）
 */
export async function getSvipPrice(forceRefresh = false) {
  const appConfig = await getAppConfig(forceRefresh)
  return appConfig?.svip_price || 20000
}

/**
 * 获取SVIP配置
 * @param {boolean} forceRefresh 是否强制刷新
 * @returns {Promise<object>} SVIP配置数据
 */
export async function getSvipConfig(forceRefresh = false) {
  const config = await getAppConfig(forceRefresh)
  return config?.svip_config || {
    price: 1,
    invite_beancoin: 1000,
    svip_solve_count: 360
  }
}

/**
 * 获取任务配置
 * @param {boolean} forceRefresh 是否强制刷新
 * @returns {Promise<object>} 任务配置数据
 */
export async function getTaskConfig(forceRefresh = false) {
  const appConfig = await getAppConfig(forceRefresh)
  return appConfig?.task_config || {}
}

/**
 * 获取支付配置
 * @param {boolean} forceRefresh 是否强制刷新
 * @returns {Promise<object>} 支付配置数据
 */
export async function getPaymentConfig(forceRefresh = false) {
  const appConfig = await getAppConfig(forceRefresh)
  return appConfig?.payment_config || {}
}

/**
 * 获取规则配置
 * @param {boolean} forceRefresh 是否强制刷新
 * @returns {Promise<object>} 规则配置数据
 */
export async function getRuleConfig(forceRefresh = false) {
  const appConfig = await getAppConfig(forceRefresh)
  return appConfig?.rule_config || {}
}

/**
 * 获取代理商配置
 * @param {boolean} forceRefresh 是否强制刷新
 * @returns {Promise<object>} 代理商配置数据
 */
export async function getAgentConfig(forceRefresh = false) {
  const appConfig = await getAppConfig(forceRefresh)
  return appConfig?.agent_config || {}
}

/**
 * 获取Banner配置
 * @param {boolean} forceRefresh 是否强制刷新
 * @returns {Promise<object>} Banner配置数据
 */
export async function getBannerConfig(forceRefresh = false) {
  const posterConfig = await getPosterConfig(forceRefresh)
  return posterConfig?.banners || {}
}

/**
 * 获取Posters配置
 * @param {boolean} forceRefresh 是否强制刷新
 * @returns {Promise<object>} Posters配置数据
 */
export async function getPostersConfig(forceRefresh = false) {
  const posterConfig = await getPosterConfig(forceRefresh)
  return posterConfig?.posters || {}
}
